import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib.ticker import MaxNLocator

sns.set(style="white", font_scale=1.5)
plt.rcParams['font.sans-serif'] = "Simsun"

# 读取Excel文件中所有工作表的数据
excel_file = 'D:\\文档\\DLMU\\实验结果.xlsx'
xls = pd.ExcelFile(excel_file)
dfs = []

# 遍历所有工作表，读取数据并合并
for sheet in xls.sheet_names:
    df = pd.read_excel(excel_file, sheet_name=sheet)
    dfs.append(df)

# 将所有工作表的数据合并为一个DataFrame
data = pd.concat(dfs)

# 计算每组参数组合的目标函数平均值
grouped = data.groupby(['狮群', '迭代', '步长因子'], as_index=False)['目标函数'].mean()
print(grouped)


# 创建透视表用于绘制热图
pivot_table = grouped.pivot_table(index='狮群', columns='迭代', values='目标函数', aggfunc='mean')
print(pivot_table)

# 绘制热图
plt.figure(figsize=(12, 8))
sns.heatmap(pivot_table, annot=False, cmap='YlGnBu')

# 设置x轴和y轴的刻度为整数
# plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))
# plt.gca().yaxis.set_major_locator(MaxNLocator(integer=True))

plt.title('狮群与迭代次数对目标函数的影响')
plt.xlabel('迭代次数', labelpad=20)
plt.ylabel('狮群数量', labelpad=20)

plt.show()

# 绘制3D响应面图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 创建网格
X, Y = np.meshgrid(sorted(grouped['狮群'].unique()), sorted(grouped['迭代'].unique()))
Z = pivot_table.values

# 绘制表面图
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')

# 设置x轴和y轴的刻度为整数
# ax.xaxis.set_major_locator(MaxNLocator(integer=True))
# ax.yaxis.set_major_locator(MaxNLocator(integer=True))

ax.set_title('狮群, 迭代与目标函数的响应面图')
ax.set_xlabel('狮群数量', labelpad=20)
ax.set_ylabel('迭代次数', labelpad=30)
ax.set_zlabel('目标函数', labelpad=30)

plt.show()
